#ifndef __MODULEMANAGER_H__
#define __MODULEMANAGER_H__

/**
 * @copyright Copyright (c) 2025 
 * CSG Digital Grid Technology (Guangdong) Co., Ltd.
 * @author zhouyan
 * @brief 模组信息解析
*/
#include "inc/sys_inc.h"
#include <sys/types.h>
#include <sys/stat.h>
#include "tools/auto_guard.h"
#include "tools/m_mutex.h"
#include "rapidjson/tools.h"

#define UART_FUNC_NUM               (3)                 //485模组
#define PLC_FUNC_NUM                (2)                 //本地通信载波模组
#define MIN_OF_SLOT_ID              (1)                 //模组最小编号
#define MAX_OF_SLOT_ID              (5)                 //模组最大编号
#define MIN_OF_UART_ID              (1)                 //串口最小编号
#define MAX_OF_UART_ID              (4)                 //串口最大编号

class ModuleManager
{
public:
    static ModuleManager* getInstance();
    ModuleManager();
    ~ModuleManager();

    bool loop();
private:
    void init();
    bool check();
    void parseOne(rapidjson::Document &doc, int theSlotId, std::map<std::string, std::string>& m);
    void saveRemap();
    void updateComs();

private:
    static ModuleManager*                               instanceM;
    static MMutex                                       instanceLockM;

    int                                                 initCntM;                           //重启终端初始化计数
    std::string                                         mapFilePathM;                       //串口映射文件
    std::string                                         checkedFilePathM;                   //模组文件  (设备管理APP更新)
    struct timespec                                     mTimeM;                             //记录最后一次模组文件修改时间
    uint64_t                                            checkTimeM;                         //检查模组文件的时间周期 (毫秒)
    uint64_t                                            nextCheckTimeM;                     //下一次检查模组文件的时间 (毫秒)
    std::map<std::string, std::string>                  remapM;                             //串口映射信息 <串口名称，具体设备节点路径>
    std::map<int, std::string>                          mapM;                               //串口名称映射表 <模组ID<<8 | 串口ID， 串口名称>
};
#endif